home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 151-175 / 169 / src / shell / set.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  4KB  |  215 lines

  1.  
  2. /*
  3.  * SET.C
  4.  *
  5.  * (c)1986 Matthew Dillon     9 October 1986
  6.  *
  7.  * Handles the variable lists for normal variables, aliases, and labels.
  8.  */
  9.  
  10. #include "shell.h"
  11. #define MAXLEVELS (3 + MAXSRC)
  12.  
  13. struct MASTER {
  14.     struct MASTER *next;
  15.     struct MASTER *last;
  16.     char *name;
  17.     char *text;
  18. };
  19.  
  20. static struct MASTER *Mbase[MAXLEVELS];
  21.  
  22. char *
  23. set_var(level, name, str)
  24. short level;
  25. register char *name, *str;
  26. {
  27.     register struct MASTER *base = Mbase[level];
  28.     register struct MASTER *last;
  29.     register short len;
  30.  
  31.     for (len = 0; isalphanum(name[len]); ++len);
  32.     while (base != NULL) {
  33.     if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  34.         Free (base->text);
  35.         goto gotit;
  36.     }
  37.     last = base;
  38.     base = base->next;
  39.     }
  40.     if (base == Mbase[level]) {
  41.     base = Mbase[level] = (struct MASTER *)malloc(sizeof(struct MASTER));
  42.     base->last = NULL;
  43.     } else {
  44.     base = (struct MASTER *)malloc (sizeof(struct MASTER));
  45.     base->last = last;
  46.     last->next = base;
  47.     }
  48.     base->name = malloc (len + 1);
  49.     bmov (name, base->name, len);
  50.     base->name[len] = 0;
  51.     base->next = NULL;
  52. gotit:
  53.     base->text = malloc (strlen(str) + 1);
  54.     strcpy (base->text, str);
  55.     return (base->text);
  56. }
  57.  
  58. char *
  59. get_var (level, name)
  60. short level;
  61. register char *name;
  62. {
  63.     register struct MASTER *base = Mbase[level];
  64.     register unsigned char *scr;
  65.     register short len;
  66.     static char *EnvBuf = NULL;
  67.     char buf[128];
  68.     long fh;
  69.  
  70.     for (scr = (UBYTE *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
  71.     len = scr - name;
  72.  
  73.     while (base != NULL) {
  74.     if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
  75.         return (base->text);
  76.     base = base->next;
  77.     }
  78.     mountrequest(0);
  79.     strcpy(buf, "ENV:");
  80.     strncat(buf, name, len);
  81.     buf[4+len] = 0;
  82.     if (fh = Open(buf, 1005)) {
  83.     long len = (Seek(fh, 0L, 1), Seek(fh, 0L, 0));
  84.     if (len < 0)
  85.         len = 256;
  86.     if (EnvBuf)
  87.         free(EnvBuf);
  88.     if (EnvBuf = malloc(len+1)) {
  89.         Seek(fh, 0L, -1);
  90.         len = Read(fh, EnvBuf, len);
  91.         if (len < 0)
  92.         len = 0;
  93.         EnvBuf[len] = 0;
  94.     }
  95.     Close(fh);
  96.     mountrequest(1);
  97.     return(EnvBuf);
  98.     }
  99.     mountrequest(1);
  100.     return (NULL);
  101. }
  102.  
  103.  
  104. unset_level(level)
  105. short level;
  106. {
  107.     register struct MASTER *base = Mbase[level];
  108.     register struct MASTER *next;
  109.  
  110.     while (base) {
  111.     next = base->next;
  112.     Free (base->name);
  113.     Free (base->text);
  114.     Free (base);
  115.     base = next;
  116.     }
  117.     Mbase[level] = NULL;
  118. }
  119.  
  120.  
  121. unset_var(level, name)
  122. short level;
  123. char *name;
  124. {
  125.     register struct MASTER *base = Mbase[level];
  126.     register struct MASTER *last = NULL;
  127.     register short len;
  128.  
  129.     for (len = 0; isalphanum(name[len]); ++len);
  130.     while (base) {
  131.     if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  132.         if (base != Mbase[level])
  133.         last->next = base->next;
  134.         else
  135.         Mbase[level] = base->next;
  136.         if (base->next != NULL)
  137.         base->next->last = last;
  138.         if (base == Mbase[level])
  139.         Mbase[level] = base->next;
  140.         Free (base->name);
  141.         Free (base->text);
  142.         Free (base);
  143.         return (1);
  144.     }
  145.     last = base;
  146.     base = base->next;
  147.     }
  148.     return (-1);
  149. }
  150.  
  151.  
  152. do_unset_var(garbage, level)
  153. short level;
  154. char *garbage;
  155. {
  156.     register short i;
  157.     register char uu = 0;
  158.  
  159.     for (i = 1; i < ac; ++i) {
  160.     unset_var (level, av[i]);
  161.     if (*av[i] == '_')
  162.         uu = '_';
  163.     }
  164.     update_under(uu);
  165.     return (0);
  166. }
  167.  
  168.  
  169. do_set_var(command, level)
  170. short level;
  171. char *command;
  172. {
  173.     register struct MASTER *base = Mbase[level];
  174.     register char *str;
  175.  
  176.     if (ac == 1) {
  177.     while (base) {
  178.         fhprintf (Cout, "%-10s ", base->name);
  179.         Oputs (base->text);
  180.         base = base->next;
  181.     }
  182.     return (0);
  183.     }
  184.     if (ac == 2) {
  185.     str = get_var (level, av[1]);
  186.     if (str) {
  187.         fhprintf (Cout, "%-10s ", av[1]);
  188.         Oputs(str);
  189.     } else {
  190.         set_var (level, av[1], "");
  191.     }
  192.     }
  193.     if (ac > 2)
  194.     set_var (level, av[1], next_word (next_word (command)));
  195.     update_under(*av[1]);
  196.     return (0);
  197. }
  198.  
  199. static
  200. update_under(c)
  201. {
  202.     register char *str;
  203.     if (c == '_') {
  204.     S_histlen = (str = get_var(LEVEL_SET, V_HIST))   ? atoi(str) : 0;
  205.     S_ignoreeof=(str = get_var(LEVEL_SET, V_IGNOREEOF)) ? 1 : 0;
  206.     SDebug      = (str = get_var(LEVEL_SET, V_DEBUG))  ? atoi(str) : 0;
  207.     Verbose   = (get_var(LEVEL_SET, V_VERBOSE)) ? 1 : 0;
  208.     if (S_histlen < 2)
  209.         S_histlen = 2;
  210.     }
  211. }
  212.  
  213.  
  214.  
  215.